package com.example.springbootdemo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author wuzhen
 */
@Configuration
@EnableSwagger2
public class Swagger2 {
	@Value("${swagger2.enable}")
	private boolean enable;

//	@Bean
//	public Docket createRestApi() {
		//Swagger调试加入令牌
//		ParameterBuilder parameterBuilder1 = new ParameterBuilder();
//		ParameterBuilder parameterBuilder2 = new ParameterBuilder();
//		ParameterBuilder parameterBuilder3 = new ParameterBuilder();
//		ParameterBuilder parameterBuilder4 = new ParameterBuilder();
//		ParameterBuilder parameterBuilder5 = new ParameterBuilder();
//		List<Parameter> parameters = new ArrayList<Parameter>();
//		parameterBuilder1.name("uid").description("当前登录用户的id")
//				.modelRef(new ModelRef("string")).parameterType("header")
//				.required(false).build(); //header中的uid参数非必填，传空也可以
//		parameterBuilder2.name("token").description("当前登录用户的token,对应平台登录后获取")
//				.modelRef(new ModelRef("string")).parameterType("header")
//				.required(false).build(); //header中的uid参数非必填，传空也可以
//		parameterBuilder3.name("timestamp").description("发送请求的时间戳")
//				.modelRef(new ModelRef("string")).parameterType("header")
//				.required(false).build(); //header中的uid参数非必填，传空也可以
//		parameterBuilder4.name("platform").description("当前用户登录的平台")
//				.modelRef(new ModelRef("string")).parameterType("header")
//				.required(false).build(); //header中的uid参数非必填，传空也可以
//		parameterBuilder5.name("signature").description("签名")
//				.modelRef(new ModelRef("string")).parameterType("header")
//				.required(false).build(); //header中的uid参数非必填，传空也可以
//		parameters.add(parameterBuilder1.build());
//		parameters.add(parameterBuilder2.build());
//		parameters.add(parameterBuilder3.build());
//		parameters.add(parameterBuilder4.build());
//		parameters.add(parameterBuilder5.build());

//		return new Docket(DocumentationType.SWAGGER_2)
//				.apiInfo(apiInfo())
//				.select()
//				.apis(RequestHandlerSelectors.basePackage("com.baize.scene.controller"))
//				.paths(PathSelectors.any())
//				.build()
////				.globalOperationParameters(parameters)
//				;
//	}
/**
 * 通过createRestApi函数创建Docket的Bean之后，
 * apiInfo()用来创建该Api的基本信息（这些基本信息会展现在文档页面中）
 * select()函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现，
 * apis()函数扫描所有Controller中定义的API， 并产生文档内容（除了被@ApiIgnore指定的请求）
 * @return
 */
	@Bean("商城")
	public Docket controller2Apis() {
		return new Docket(DocumentationType.SWAGGER_2)
				.groupName("商城")
				.select()
				.apis(RequestHandlerSelectors.basePackage("com.example.springbootdemo.mall.controller"))
				.paths(PathSelectors.any())
				.build()
				.apiInfo(apiInfo())
				.enable(enable);
	}

	@Bean("景区")
	public Docket controller1Apis() {
		return new Docket(DocumentationType.SWAGGER_2)
				.groupName("景区")
				.select()
				//RequestHandlerSelectors 配置要扫描接口的方式
				//basePackage 指定要扫描的包
				//any() 扫描全部
				//none()不扫描
				//withClassAnnotation  扫描类上的注解
				//withMethodAnnotation 扫描方法上的注解

				.apis(RequestHandlerSelectors.basePackage("com.example.springbootdemo.scene.controller"))
				//过滤什么路径
				//.paths(PathSelectors.ant("/hello/**")) //监听
				.paths(PathSelectors.any())// 对所有路径进行监控
				.build()
				.apiInfo(apiInfo())
				.enable(enable); //可以开启或关闭swagger文档
	}

	@Bean("测试")
	public Docket controller3Apis() {
		return new Docket(DocumentationType.SWAGGER_2)
				.groupName("测试")
				.select()
				//RequestHandlerSelectors 配置要扫描接口的方式
				//basePackage 指定要扫描的包
				//any() 扫描全部
				//none()不扫描
				//withClassAnnotation  扫描类上的注解
				//withMethodAnnotation 扫描方法上的注解

				.apis(RequestHandlerSelectors.basePackage("com.example.springbootdemo.controller"))
				//过滤什么路径
				//.paths(PathSelectors.ant("/hello/**")) //监听
				.paths(PathSelectors.any())// 对所有路径进行监控
				.build()
				.apiInfo(apiInfo())
				.enable(enable); //可以开启或关闭swagger文档
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder()
				.title("springboot")
				.description("前后端联调swagger api 文档")
				.termsOfServiceUrl("")
				.version("1.0")
				.build();
	}
}

//@Api 注解在controller类上
//@ApiModel 注解在类上，一般是实体类
//@ApiOperation 注解在方法上，表明方法级解释
//@ApiImplicitParams 注解在方法上，一般与@ApiImplicitParam共用，多个参数逗号隔开,表请求参数
//@ApiResponses 注解在方法上表响应，一般与@ApiResponse公用
